home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2001 May / SGI Freeware 2001 May - Disc 3.iso / dist / fw_squid.idb / usr / freeware / squid / doc / Programming-Guide / prog-guide.sgml.z / prog-guide.sgml
SGML Document  |  2000-04-13  |  56KB

  1. <!doctype linuxdoc system>
  2. <article>
  3. <title>Squid Programmers Guide</title>
  4. <author>Duane Wessels, Squid Developers
  5.  
  6. <abstract>
  7. Squid is a WWW Cache application developed by the National Laboratory
  8. for Applied Network Research and members of the Web Caching community.
  9. Squid is implemented as a single, non-blocking process based around
  10. a BSD select() loop.  This document describes the operation of the Squid
  11. source code and is intended to be used by others who wish to customize
  12. or improve it.
  13. </abstract>
  14.  
  15. <toc>
  16.  
  17.  
  18. <!-- %%%% Chapter : INTRODUCTION %%%% -->
  19. <sect>Introduction
  20.  
  21.     <P>
  22.     The Squid source code has evolved more from empirical
  23.     observation and tinkering, rather than a solid design
  24.     process.  It carries a legacy of being ``touched'' by
  25.     numerous individuals, each with somewhat different techniques
  26.     and terminology.
  27.  
  28.     <P>
  29.     Squid is a single-process proxy server.  Every request is
  30.     handled by the main process, with the exception of FTP.
  31.     However, Squid does not use a ``threads package'' such has
  32.     Pthreads.  While this might be easier to code, it suffers
  33.     from portability and performance problems.  Instead Squid
  34.     maintains data structures and state information for each
  35.     active request.
  36.  
  37.     <P>
  38.     The code is often difficult to follow because there are no
  39.     explicit state variables for the active requests.  Instead,
  40.     thread execution progresses as a sequence of ``callback
  41.     functions'' which get executed when I/O is ready to occur,
  42.     or some other event has happened.  As a callback function
  43.     completes, it is responsible for registering the next
  44.     callback function for subsequent I/O.
  45.  
  46.     <P>
  47.     Note there is only a pseudo-consistent naming scheme.  In
  48.     most cases functions are named like <tt/moduleFooBar()/.
  49.     However, there are also some functions named like
  50.     <tt/module_foo_bar()/.
  51.  
  52.     <P>
  53.     Note that the Squid source changes rapidly, and some parts
  54.     of this document may become out-of-date.  If you find any
  55.     inconsistencies, please feel free to notify <url
  56.     url="mailto:squid-dev@nlanr.net" name="the Squid Developers">.
  57.  
  58. <sect1>Conventions
  59.  
  60.     <P>
  61.     Function names and file names will be written in a courier
  62.     font, such as <tt/store.c/ and <tt/storeRegister()/.  Data
  63.     structures and their members will be written in an italicized
  64.     font, such as <em/StoreEntry/.
  65.  
  66.  
  67. <sect>Overview of Squid Components
  68.  
  69.     <P>
  70. Squid consists of the following major components
  71.  
  72. <sect1>Client Side
  73.  
  74.     <P>
  75.     Here new client connections are accepted, parsed, and
  76.     processed.  This is where we determine if the request is
  77.     a cache HIT, REFRESH, MISS, etc.  With HTTP/1.1 we may have
  78.     multiple requests from a single TCP connection.  Per-connection
  79.     state information is held in a data structure called
  80.     <em/ConnStateData/.  Per-request state information is stored
  81.     in the <em/clientHttpRequest/ structure.
  82.     
  83. <sect1>Server Side
  84.  
  85.     <P>
  86.     These routines are responsible for forwarding cache misses
  87.     to other servers, depending on the protocol.  Cache misses
  88.     may be forwarded to either origin servers, or other proxy
  89.     caches.  Note that all requests (FTP, Gopher) to other
  90.     proxies are sent as HTTP requests.  <tt/gopher.c/ is somewhat
  91.     complex and gross because it must convert from the Gopher
  92.     protocol to HTTP.  Wais and Gopher don't receive much
  93.     attention because they comprise a relatively insignificant
  94.     portion of Internet traffic.
  95.  
  96. <sect1>Storage Manager
  97.  
  98.     <P>
  99.     The Storage Manager is the glue between client and server
  100.     sides.  Every object saved in the cache is allocated a
  101.     <em/StoreEntry/ structure.  While the object is being
  102.     accessed, it also has a <em/MemObject/ structure.
  103.  
  104.     <P>
  105.     Squid can quickly locate cached objects because it keeps
  106.     (in memory) a hash table of all <em/StoreEntry/'s.  The
  107.     keys for the hash table are MD5 checksums of the objects
  108.     URI.  In addition there is also a doubly-linked list of
  109.     <em/StoreEntry/'s used for the LRU replacement algorithm.
  110.     When an entry is accessed, it is moved to the head of the
  111.     LRU list.  When Squid needs to replace cached objects, it
  112.     takes objects from the tail of the LRU list.
  113.  
  114.     <P>
  115.     Objects are saved to disk in a two-level directory structure.
  116.     For each object the <em/StoreEntry/ includes a 4-byte
  117.     <em/fileno/ field.  This file number is converted to a disk
  118.     pathname by a simple algorithm which evenly distributes
  119.     the files across all cache directories.  A cache swap file
  120.     consists of two parts: the cache metadata, and the object
  121.     data.  Note the object data includes the full HTTP
  122.     reply---headers and body.  The HTTP reply headers are not
  123.     the same as the cache metadata.
  124.  
  125.     <P>
  126.     Client-side requests register themselves with a <em/StoreEntry/
  127.     to be notified when new data arrives.  Multiple clients
  128.     may receive data via a single <em/StoreEntry/.  For POST
  129.     and PUT request, this process works in reverse.  Server-side
  130.     functions are notified when additional data is read from
  131.     the client.
  132.  
  133. <sect1>Request Forwarding
  134.  
  135. <sect1>Peer Selection
  136.  
  137.     <P>
  138.     These functions are responsible for selecting one (or none)
  139.     of the neighbor caches as the appropriate forwarding
  140.     location.
  141.  
  142. <sect1>Access Control
  143.  
  144.     <P>
  145.     These functions are responsible for allowing or denying a
  146.     request, based on a number of different parameters.  These
  147.     parameters include the client's IP address, the hostname
  148.     of the requested resource, the request method, etc.  Some
  149.     of the necessary information may not be immediately available,
  150.     for example the origin server's IP address.  In these cases,
  151.     the ACL routines initiate lookups for the necessary
  152.     information and continues the access control checks when
  153.     the information is available.
  154.  
  155. <sect1>Network Communication
  156.  
  157.     <P>
  158.     These are the routines for communicating over TCP and UDP
  159.     network sockets.  Here is where sockets are opened, closed,
  160.     read, and written.  In addition, note that the heart of
  161.     Squid (<tt/comm_select()/ or <tt/comm_poll()/) exists here,
  162.     even though it handles all file descriptors, not just
  163.     network sockets.  These routines do not support queuing
  164.     multiple blocks of data for writing.  Consequently, a
  165.     callback occurs for every write request.
  166.  
  167. <sect1>File/Disk I/O
  168.  
  169.     <P>
  170.     Routines for reading and writing disk files (and FIFOs).
  171.     Reasons for separating network and disk I/O functions are
  172.     partly historical, and partly because of different behaviors.
  173.     For example, we don't worry about getting a ``No space left
  174.     on device'' error for network sockets.  The disk I/O routines
  175.     support queuing of multiple blocks for writing.  In some
  176.     cases, it is possible to merge multiple blocks into a single
  177.     write request.  The write callback does not necessarily
  178.     occur for every write request.
  179.  
  180. <sect1>Neighbors
  181.  
  182.     <P>
  183.     Maintains the list of neighbor caches.  Sends and receives
  184.     ICP messages to neighbors.  Decides which neighbors to
  185.     query for a given request.  File: <tt/neighbors.c/.
  186.  
  187. <sect1>IP/FQDN Cache
  188.  
  189.     <P>
  190.     A cache of name-to-address and address-to-name lookups.
  191.     These are hash tables keyed on the names and addresses.
  192.     <tt/ipcache_nbgethostbyname()/ and <tt/fqdncache_nbgethostbyaddr()/
  193.     implement the non-blocking lookups.  Files: <tt/ipcache.c/,
  194.     <tt/fqdncache.c/.
  195.  
  196. <sect1>Cache Manager
  197.  
  198.     <P>
  199.     This provides access to certain information needed by the
  200.     cache administrator.  A companion program, <em/cachemgr.cgi/
  201.     can be used to make this information available via a Web
  202.     browser.  Cache manager requests to Squid are made with a 
  203.     special URL of the form
  204. <verb>
  205.     cache_object://hostname/operation
  206. </verb>
  207.     The cache manager provides essentially ``read-only'' access
  208.     to information.  It does not provide a method for configuring
  209.     Squid while it is running.
  210.  
  211. <sect1>Network Measurement Database
  212.  
  213.     <P>
  214.     In a number of situation, Squid finds it useful to know the
  215.     estimated network round-trip time (RTT) between itself and
  216.     origin servers.  A particularly useful is example is
  217.     the peer selection algorithm.  By making RTT measurements, a
  218.     Squid cache will know if it, or one if its neighbors, is closest
  219.     to a given origin server.  The actual measurements are made
  220.     with the <em/pinger/ program, described below.  The measured
  221.     values are stored in a database indexed under two keys.  The 
  222.     primary index field is the /24 prefix of the origin server's
  223.     IP address.  Secondly, a hash table of fully-qualified host
  224.     names have have data structures with links to the appropriate
  225.     network entry.  This allows Squid to quickly look up measurements
  226.     when given either an IP address, or a host name.  The /24 prefix
  227.     aggregation is used to reduce the overall database size.  File:
  228.     <tt/net_db.c/.
  229.  
  230. <sect1>Redirectors
  231.  
  232.     <P>
  233.     Squid has the ability to rewrite requests from clients.  After
  234.     checking the access controls, but before checking for cache hits,
  235.     requested URLs may optionally be written to an external
  236.     <em/redirector/ process.  This program, which can be highly
  237.     customized, may return a new URL to replace the original request.
  238.     Common applications for this feature are extended access controls
  239.     and local mirroring.  File: <tt/redirect.c/.
  240.  
  241. <sect1>Autonomous System Numbers
  242.  
  243.     <P>
  244.     Squid supports Autonomous System (AS) numbers as another 
  245.     access control element.  The routines in <tt/asn.c/
  246.     query databases which map AS numbers into lists of CIDR
  247.     prefixes.  These results are stored in a radix tree which
  248.     allows fast searching of the AS number for a given IP address.
  249.  
  250. <sect1>Configuration File Parsing
  251.  
  252.     <P>
  253.     The primary configuration file specification is in the file
  254.     <tt/cf.data.pre/.  A simple utility program, <tt/cf_gen/,
  255.     reads the <tt/cf.data.pre/ file and generates <tt/cf_parser.c/
  256.     and <tt/squid.conf/.  <tt/cf_parser.c/ is included directly
  257.     into <tt/cache_cf.c/ at compile time.
  258.  
  259. <sect1>Callback Data Database
  260.  
  261.     <P>
  262.     Squid's extensive use of callback functions makes it very
  263.     susceptible to memory access errors.  Care must be taken
  264.     so that the <tt/callback_data/ memory is still valid when
  265.     the callback function is executed.  The routines in <tt/cbdata.c/
  266.     provide a uniform method for managing callback data memory,
  267.     canceling callbacks, and preventing erroneous memory accesses.
  268.  
  269. <sect1>Debugging
  270.  
  271.     <P>
  272.     Squid includes extensive debugging statements to assist in
  273.     tracking down bugs and strange behavior.  Every debug statement
  274.     is assigned a section and level.  Usually, every debug statement
  275.     in the same source file has the same section.  Levels are chosen
  276.     depending on how much output will be generated, or how useful the
  277.     provided information will be.  The <em/debug_options/ line 
  278.     in the configuration file determines which debug statements will
  279.     be shown and which will not.  The <em/debug_options/ line
  280.     assigns a maximum level for every section.  If a given debug
  281.     statement has a level less than or equal to the configured
  282.     level for that section, it will be shown.  This description
  283.     probably sounds more complicated than it really is.
  284.     File: <em/debug.c/.  Note that <tt/debug()/ itself is a macro.
  285.  
  286. <sect1>Error Generation
  287.  
  288.     <P>
  289.     The routines in <tt/errorpage.c/ generate error messages from
  290.     a template file and specific request parameters.  This allows
  291.     for customized error messages and multilingual support.
  292.  
  293. <sect1>Event Queue
  294.  
  295.     <P>
  296.     The routines in <tt/event.c/ maintain a linked-list event
  297.     queue for functions to be executed at a future time.  The
  298.     event queue is used for periodic functions such as performing
  299.     cache replacement, cleaning swap directories, as well as one-time
  300.     functions such as ICP query timeouts.
  301.  
  302. <sect1>Filedescriptor Management
  303.  
  304.     <P>
  305.     Here we track the number of filedescriptors in use, and the
  306.     number of bytes which has been read from or written to each
  307.     file descriptor.
  308.  
  309.  
  310. <sect1>Hashtable Support
  311.  
  312.     <P>
  313.     These routines implement generic hash tables.  A hash table
  314.     is created with a function for hashing the key values, and a
  315.     function for comparing the key values.
  316.  
  317. <sect1>HTTP Anonymization
  318.  
  319.     <P>
  320.     These routines support anonymizing of HTTP requests leaving
  321.     the cache.  Either specific request headers will be removed
  322.     (the ``standard'' mode), or only specific request headers
  323.     will be allowed (the ``paranoid'' mode).
  324.  
  325.  
  326. <sect1>Internet Cache Protocol
  327.  
  328.     <P>
  329.     Here we implement the Internet Cache Protocol.  This 
  330.     protocol is documented in the RFC 2186 and RFC 2187.
  331.     The bulk of code is in the <tt/icp_v2.c/ file.  The 
  332.     other, <tt/icp_v3.c/ is a single function for handling
  333.     ICP queries from Netcache/Netapp caches; they use
  334.     a different version number and a slightly different message
  335.     format.
  336.  
  337. <sect1>Ident Lookups
  338.  
  339.     <P>
  340.     These routines support RFC 931 ``Ident'' lookups.   An ident
  341.     server running on a host will report the user name associated
  342.     with a connected TCP socket.  Some sites use this facility for
  343.     access control and logging purposes.
  344.  
  345. <sect1>Memory Management
  346.  
  347.     <P>
  348.     These routines allocate and manage pools of memory for
  349.     frequently-used data structures.  When the <em/memory_pools/
  350.     configuration option is enabled, unused memory is not actually
  351.     freed.  Instead it is kept for future use.  This may result
  352.     in more efficient use of memory at the expense of a larger
  353.     process size.
  354.  
  355. <sect1>Multicast Support
  356.  
  357.     <P>
  358.     Currently, multicast is only used for ICP queries.   The
  359.     routines in this file implement joining a UDP 
  360.     socket to a multicast group (or groups), and setting
  361.     the multicast TTL value on outgoing packets.
  362.  
  363. <sect1>Persistent Server Connections
  364.  
  365.     <P>
  366.     These routines manage idle, persistent HTTP connections
  367.     to origin servers and neighbor caches.  Idle sockets
  368.     are indexed in a hash table by their socket address
  369.     (IP address and port number).  Up to 10 idle sockets
  370.     will be kept for each socket address, but only for
  371.     15 seconds.  After 15 seconds, idle socket connections
  372.     are closed.
  373.  
  374. <sect1>Refresh Rules
  375.  
  376.     <P>
  377.     These routines decide wether a cached object is stale or fresh,
  378.     based on the <em/refresh_pattern/ configuration options.
  379.     If an object is fresh, it can be returned as a cache hit.
  380.     If it is stale, then it must be revalidated with an    
  381.     If-Modified-Since request.
  382.  
  383. <sect1>SNMP Support
  384.  
  385.     <P>
  386.     These routines implement SNMP for Squid.  At the present time,
  387.     we have made almost all of the cachemgr information available
  388.     via SNMP.
  389.  
  390. <sect1>URN Support
  391.  
  392.     <P>
  393.     We are experimenting with URN support in Squid version 1.2.
  394.     Note, we're not talking full-blown generic URN's here. This
  395.     is primarily targeted towards using URN's as an smart way
  396.     of handling lists of mirror sites.  For more details, please
  397.     see <url        url="http://squid.nlanr.net/Squid/urn-support.html"
  398.     name="URN support in Squid">.
  399.  
  400.  
  401. <sect>External Programs
  402.  
  403. <sect1>dnsserver
  404.  
  405.     <P>
  406.     Because the standard <tt/gethostbyname(3)/ library call
  407.     blocks, Squid must use external processes to actually make
  408.     these calls.  Typically there will be ten <tt/dnsserver/
  409.     processes spawned from Squid.  Communication occurs via
  410.     TCP sockets bound to the loopback interface.  The functions
  411.     in <tt/dns.c/ are primarily concerned with starting and
  412.     stopping the dnsservers.  Reading and writing to and from
  413.     the dnsservers occurs in the IP and FQDN cache modules.
  414.  
  415. <sect1>pinger
  416.  
  417.     <P>
  418.     Although it would be possible for Squid to send and receive
  419.     ICMP messages directly, we use an external process for
  420.     two important reasons:
  421.     <enum>
  422.     <item>Because squid handles many filedescriptors simultaneously,
  423.     we get much more accurate RTT measurements when ICMP is
  424.     handled by a separate process.
  425.     <item>Superuser privileges are required to send and receive
  426.     ICMP.  Rather than require Squid to be started as root,
  427.     we prefer to have the smaller and simpler <em/pinger/
  428.     program installed with setuid permissions.
  429.     </enum>
  430.  
  431. <sect1>unlinkd
  432.  
  433.     <P>
  434.     The <tt/unlink(2)/ system call can cause a process to block
  435.     for a significant amount of time.  Therefore we do not want
  436.     to make unlink() calls from Squid.  Instead we pass them
  437.     to this external process.
  438.  
  439. <sect1>redirector
  440.  
  441.     <P>
  442.     A redirector process reads URLs on stdin and writes (possibly
  443.     changed) URLs on stdout.  It is implemented as an external
  444.     process to maximize flexibility.
  445.  
  446. <sect>Flow of a Typical Request
  447.  
  448.     <P>
  449.     <enum>
  450.     <item>
  451.     A client connection is accepted by the <em/client-side/.
  452.     The HTTP request is parsed.
  453.  
  454.     <item>
  455.     The access controls are checked.  The client-side builds
  456.     an ACL state data structure and registers a callback function
  457.     for notification when access control checking is completed.
  458.  
  459.     <item>
  460.     After the access controls have been verified, the client-side
  461.     looks for the requested object in the cache.  If is a cache
  462.     hit, then the client-side registers its interest in the
  463.     <em/StoreEntry/.  Otherwise, Squid needs to forward the
  464.     request, perhaps with an If-Modified-Since header.
  465.  
  466.     <item>
  467.     The request-forwarding process begins with <tt/protoDispatch/.
  468.     This function begins the peer selection procedure, which
  469.     may involve sending ICP queries and receiving ICP replies.
  470.     The peer selection procedure also involves checking
  471.     configuration options such as <em/never_direct/ and
  472.     <em/always_direct/.
  473.  
  474.     <item>
  475.     When the ICP replies (if any) have been processed, we end
  476.     up at <em/protoStart/.  This function calls an appropriate
  477.     protocol-specific function for forwarding the request.
  478.     Here we will assume it is an HTTP request.
  479.  
  480.     <item>
  481.     The HTTP module first opens a connection to the origin
  482.     server or cache peer.  If there is no idle persistent socket
  483.     available, a new connection request is given to the Network
  484.     Communication module with a callback function.  The
  485.     <tt/comm.c/ routines may try establishing a connection
  486.     multiple times before giving up.
  487.  
  488.     <item>
  489.     When a TCP connection has been established, HTTP builds a
  490.     request buffer and submits it for writing on the socket.
  491.     It then registers a read handler to receive and process
  492.     the HTTP reply.
  493.  
  494.     <item>
  495.     As the reply is initially received, the HTTP reply headers
  496.     are parsed and placed into a reply data structure.  As
  497.     reply data is read, it is appended to the <em/StoreEntry/.
  498.     Every time data is appended to the <em/StoreEntry/, the
  499.     client-side is notified of the new data via a callback
  500.     function.
  501.  
  502.     <item>
  503.     As the client-side is notified of new data, it copies the
  504.     data from the StoreEntry and submits it for writing on the
  505.     client socket.
  506.  
  507.     <item>
  508.     As data is appended to the <em/StoreEntry/, and the client(s)
  509.     read it, the data may be submitted for writing to disk.
  510.  
  511.     <item>
  512.     When the HTTP module finishes reading the reply from the
  513.     upstream server, it marks the <em/StoreEntry/ as ``complete.''
  514.     The server socket is either closed or given to the persistent
  515.     connection pool for future use.
  516.  
  517.     <item>
  518.     When the client-side has written all of the object data,
  519.     it unregisters itself from the <em/StoreEntry/.  At the
  520.     same time it either waits for another request from the
  521.     client, or closes the client connection.
  522.  
  523.     </enum>
  524.  
  525. <sect>Callback Functions
  526.  
  527. <sect>The Main Loop: <tt/comm_select()/
  528.  
  529.     <P>
  530.     At the core of Squid is the <tt/select(2)/ system call.
  531.     Squid uses <tt/select()/ or <tt/poll(2)/ to process I/O on
  532.     all open file descriptors.  Hereafter we'll only use
  533.     ``select'' to refer generically to either system call.
  534.  
  535.     <P>
  536.     The <tt/select()/ and <tt/poll()/ system calls work by
  537.     waiting for I/O events on a set of file descriptors.  Squid
  538.     only checks for <em/read/ and <em/write/ events. Squid
  539.     knows that it should check for reading or writing when
  540.     there is a read or write handler registered for a given
  541.     file descriptor.  Handler functions are registered with
  542.     the <tt/commSetSelect/ function.  For example:
  543. <verb>
  544.     commSetSelect(fd, COMM_SELECT_READ, clientReadRequest, conn, 0);
  545. </verb>
  546.     In this example, <em/fd/ is a TCP socket to a client
  547.     connection.  When there is data to be read from the socket,
  548.     then the select loop will execute
  549. <verb>
  550.     clientReadRequest(fd, conn);
  551. </verb>
  552.  
  553.     <P>
  554.     The I/O handlers are reset every time they are called.  In
  555.     other words, a handler function must re-register itself
  556.     with <tt/commSetSelect/ if it wants to continue reading or
  557.     writing on a file descriptor.  The I/O handler may be
  558.     canceled before being called by providing NULL arguments,
  559.     e.g.:
  560. <verb>
  561.     commSetSelect(fd, COMM_SELECT_READ, NULL, NULL, 0);
  562. </verb>
  563.  
  564.     <P>
  565.     These I/O handlers (and others) and their associated callback
  566.     data pointers are saved in the <em/fde/ data structure:
  567. <verb>
  568.     struct _fde {
  569.         ...
  570.         PF *read_handler;
  571.         void *read_data;
  572.         PF *write_handler;
  573.         void *write_data;
  574.         close_handler *close_handler;
  575.         DEFER *defer_check;
  576.         void *defer_data;
  577.     };
  578. </verb>
  579.     <em/read_handler/ and <em/write_handler/ are called when
  580.     the file descriptor is ready for reading or writing,
  581.     respectively.  The <em/close_handler/ is called when the
  582.     filedescriptor is closed.   The <em/close_handler/ is
  583.     actually a linked list of callback functions to be called.
  584.  
  585.     <P>
  586.     In some situations we want to defer reading from a
  587.     filedescriptor, even though it has data for us to read.
  588.     This may be the case when data arrives from the server-side
  589.     faster than it can be written to the client-side.  Before
  590.     adding a filedescriptor to the ``read set'' for select, we
  591.     call <em/defer_check/ (if it is non-NULL).  If <em/defer_check/
  592.     returns 1, then we skip the filedescriptor for that time
  593.     through the select loop.
  594.  
  595.  
  596.  
  597.     <P>
  598.     These handlers are stored in the <em/FD_ENTRY/ structure
  599.     as defined in <tt/comm.h/.  <tt/fd_table[]/ is the global
  600.     array of <em/FD_ENTRY/ structures.  The handler functions
  601.     are of type <em/PF/, which is a typedef:
  602. <verb>
  603.     typedef void (*PF) (int, void *);
  604. </verb>
  605.     The close handler is really a linked list of handler
  606.     functions.  Each handler also has an associated pointer
  607.     <tt/(void *data)/ to some kind of data structure.
  608.  
  609.     <P>
  610.     <tt/comm_select()/ is the function which issues the select()
  611.     system call.  It scans the entire <tt/fd_table[]/ array
  612.     looking for handler functions.  Each file descriptor with
  613.     a read handler will be set in the <tt/fd_set/ read bitmask.
  614.     Similarly, write handlers are scanned and bits set for the
  615.     write bitmask.  <tt/select()/ is then called, and the return
  616.     read and write bitmasks are scanned for descriptors with
  617.     pending I/O.  For each ready descriptor, the handler is
  618.     called.  Note that the handler is cleared from the
  619.     <em/FD_ENTRY/ before it is called.
  620.  
  621.     <P>
  622.     After each handler is called, <tt/comm_select_incoming()/
  623.     is called to process new HTTP and ICP requests.
  624.  
  625.     <P>
  626.     Typical read handlers are
  627.     <tt/httpReadReply()/,
  628.     <tt/diskHandleRead()/,
  629.     <tt/icpHandleUdp()/,
  630.     and <tt/ipcache_dnsHandleRead()/.
  631.     Typical write handlers are
  632.     <tt/commHandleWrite()/,
  633.     <tt/diskHandleWrite()/,
  634.     and <tt/icpUdpReply()/.
  635.     The handler function is set with <tt/commSetSelect()/, with the
  636.     exception of the close handlers, which are set with
  637.     <tt/comm_add_close_handler()/.
  638.  
  639.     <P>
  640.     The close handlers are normally called from <tt/comm_close()/.
  641.     The job of the close handlers is to deallocate data structures
  642.     associated with the file descriptor.  For this reason
  643.     <tt/comm_close()/ must normally be the last function in a
  644.     sequence to prevent accessing just-freed memory.
  645.  
  646.     <P>
  647.     The timeout and lifetime handlers are called for file
  648.     descriptors which have been idle for too long.  They are
  649.     further discussed in a following chapter.
  650.  
  651. <!-- %%%% Chapter : CLIENT REQUEST PROCESSING %%%% -->
  652. <sect>Processing Client Requests
  653.  
  654. <!-- %%%% Chapter : STORAGE MANAGER %%%% -->
  655. <sect>Storage Manager
  656.  
  657. <!-- %%%% Chapter : FILESYSTEM INTERFACE %%%% -->
  658. <sect>Filesystem Interface
  659.  
  660. <sect1>Introduction
  661.  
  662.     <P>
  663.     Traditionally, Squid has always used the Unix filesystem (UFS)
  664.     to store cache objects on disk.  Over the years, the
  665.     poor performance of UFS has become very obvious.  In most
  666.     cases, UFS limits Squid to about 30-50 requests per second.
  667.     Our work indicates that the poor performance is mostly
  668.     due to the synchronous nature of <tt/open()/ and <tt/unlink()/
  669.     system calls, and perhaps thrashing of inode/buffer caches.
  670.  
  671.     <P>
  672.     We want to try out our own, customized filesystems with Squid.
  673.     In order to do that, we need a well-defined interface
  674.     for the bits of Squid that access the permanent storage
  675.     devices.
  676.  
  677. <sect1>The Interface
  678.  
  679. <sect2>Data Structures
  680.  
  681. <sect3><em/storeIOState/
  682.  
  683.     <P>
  684.     Every cache object that is ``opened'' for reading or writing
  685.     will have a <em/storeIOState/ data structure associated with
  686.     it.  Currently, this structure looks like:
  687. <verb>
  688.         struct _storeIOState {
  689.             sfileno swap_file_number;
  690.             mode_t mode;
  691.             size_t st_size;             /* do stat(2) after read open */
  692.             off_t offset;               /* current offset pointer */
  693.             STIOCB *callback;
  694.             void *callback_data;
  695.             struct {
  696.                 STRCB *callback;
  697.                 void *callback_data;
  698.             } read;
  699.             struct {
  700.                 unsigned int closing:1; /* debugging aid */
  701.             } flags;
  702.             union {
  703.                 struct {
  704.                     int fd;
  705.                     struct {
  706.                         unsigned int close_request:1;
  707.                         unsigned int reading:1;
  708.                         unsigned int writing:1;
  709.                     } flags;
  710.                 } ufs;
  711.             } type;
  712.         };
  713. </verb>
  714.  
  715.     <em/swap_file_number/ is the 32-bit swap file number for the
  716.     object, taken from the <em/StoreEntry/.
  717.  
  718.     <em/mode/ is either O_RDONLY or O_WRONLY.
  719.  
  720.     <em/offset/ represents the file (byte) offset after the
  721.     last operation completed.  For example, after a read operation,
  722.     <em/offset/ must be incremented by the number of bytes read.
  723.     The same goes for write operations.  This means that the
  724.     filesystem layer needs explicit (callback) notification
  725.     for writes.  It is wrong to increment <em/offset/ before
  726.     an I/O operation has been known to succeed.
  727.  
  728.     <em/st_size/ is filled in with the object's on-disk size
  729.     after an object is opened for reading.  This allows
  730.     the upper layers to double-check that the disk object
  731.     actually belongs to the StoreEntry.
  732.  
  733.     Note that there are two callback functions.  The first,
  734.     <em/callback/, of type <em/STIOCB/ (store I/O callback),
  735.     is callback for the <em/storeIOState/ as a whole.  This
  736.     callback is used to indicate success or failure of accessing
  737.     the object, whether its for reading or writing.
  738.     There are no callbacks for open and write operations,
  739.     unless they fail.
  740.  
  741.     The second, <em/read.callback/, of type <em/STRCB/ (store
  742.     read callback) is used for every read operation.
  743.  
  744.     The ugly union is used to hold filesystem-specific state
  745.     information.
  746.  
  747.     <em/storeIOState/ structures are allocated by calling
  748.     <tt/storeOpen()/, and will be deallocated by the
  749.     filesystem layer after
  750.     <tt/storeClose()/ is called.
  751.  
  752. <sect2>External Functions
  753.  
  754. <sect3>Object I/O
  755.  
  756.     <P>
  757.     These functions all relate to per-object I/O tasks: opening,
  758.     closing, reading, writing, and unlinking objects on disk.
  759.     These functions can all be found in <tt/store_io.c/.
  760.  
  761.     <P>
  762.     Note that the underlying storage system functions are
  763.     accessed through function pointers, kept in the
  764.     <em/SwapDir/ structure:
  765. <verb>
  766.     struct _SwapDir {
  767.     ....
  768.         struct {
  769.             STOBJOPEN *open;
  770.             STOBJCLOSE *close;
  771.             STOBJREAD *read;
  772.             STOBJWRITE *write;
  773.             STOBJUNLINK *unlink;
  774.         } obj;
  775.     ....
  776.     };
  777. </verb>
  778.  
  779.     <P>
  780.     Thus, a storage system must do something like this
  781.     when initializing its <em/SwapDir/ structure:
  782. <verb>
  783.             SwapDir->obj.open = storeFooOpen;
  784.             SwapDir->obj.close = storeFooClose;
  785.             SwapDir->obj.read = storeFooRead;
  786.             SwapDir->obj.write = storeFooWrite;
  787.             SwapDir->obj.unlink = storeFooUnlink;
  788. </verb>
  789.  
  790. <sect4><tt/storeOpen()/
  791.  
  792.     <P>
  793. <verb>
  794.     storeIOState *
  795.     storeOpen(sfileno f, mode_t mode, STIOCB *callback, void *callback_data)
  796. </verb>
  797.  
  798.     <P>
  799.     <tt/storeOpen()/
  800.     submits a request to open a cache object for reading or writing.
  801.     <tt/f/ is the 32-bit swap file number of the cached object.
  802.     <tt/mode/ should be either <tt/O_RDONLY/ or <tt/O_WRONLY/.
  803.  
  804.     <P>
  805.     <tt/callback/ is a function that will be called either when
  806.     an error is encountered, or when the object is closed (by
  807.     calling <tt/storeClose()/).  If the open request is
  808.     successful, there is no callback.  The calling module must
  809.     assume the open request will succeed, and may begin reading
  810.     or writing immediately.
  811.  
  812.     <P>
  813.     <tt/storeOpen()/ may return NULL if the requested object
  814.     can not be openeed.  In this case the <tt/callback/ function
  815.     will not be called.
  816.  
  817. <sect4><tt/storeClose()/
  818.  
  819.     <P>
  820. <verb>
  821.     void
  822.     storeClose(storeIOState *sio)
  823. </verb>
  824.  
  825.     <P>
  826.     <tt/storeClose()/
  827.     submits a request to close the cache object.  It is safe to request
  828.     a close even if there are read or write operations pending.
  829.     When the underlying filesystem actually closes the object,
  830.     the <em/STIOCB/ callback (registered with <tt/storeOpen()/) will
  831.     be called.
  832.  
  833. <sect4><tt/storeRead()/
  834.  
  835.     <P>
  836. <verb>
  837.     void
  838.     storeRead(storeIOState *sio, char *buf, size_t size, off_t offset, STRCB *callback, void *callback_data)
  839. </verb>
  840.  
  841.     <P>
  842.     <tt/storeRead()/ is more complicated than the other functions
  843.     because it requires its own callback function to notify the
  844.     caller when the requested data has actually been read. 
  845.     <em/buf/ must be a valid memory buffer of at least <em/size/
  846.     bytes.  <em/offset/ specifies the byte offset where the
  847.     read should begin.  Note that with the Swap Meta Headers
  848.     prepended to each cache object, this offset does not equal
  849.     the offset into the actual object data.
  850.  
  851.     <P>
  852.     The caller is responsible for allocating and freeing <em/buf/
  853.  
  854. <sect4><tt/storeWrite()/
  855.  
  856.     <P>
  857. <verb>
  858.     void
  859.     storeWrite(storeIOState *sio, char *buf, size_t size, off_t offset, FREE *free_func)
  860. </verb>
  861.  
  862.     <P>
  863.     <tt/storeWrite()/ submits a request to write a block
  864.     of data to the disk store.  
  865.     The caller is responsible for allocating <em/buf/, but since
  866.     there is no per-write callback, this memory must be freed by
  867.     the lower filesystem implementation.  Therefore, the caller
  868.     must specify the <em/free_func/ to be used to deallocate
  869.     the memory.
  870.  
  871.     <P>
  872.     If a write operation fails, the filesystem layer notifies the
  873.     calling module by calling the <em/STIOCB/ callback with an
  874.     error status code.
  875.  
  876. <sect4><tt/storeUnlink()/
  877.  
  878.     <P>
  879. <verb>
  880.     void
  881.     storeUnlink(sfileno f)
  882. </verb>
  883.  
  884.     <P>
  885.     <tt/storeUnlink()/ removes the cached object from the disk
  886.     store.  There is no callback function, and the object
  887.     does not need to be opened first.  The filesystem
  888.     layer will remove the object if it exists on the disk.
  889.  
  890. <sect4><tt/storeOffset()/
  891.  
  892.     <P>
  893. <verb>
  894.     off_t
  895.     storeOffset(storeIOState *sio)
  896. </verb>
  897.  
  898.     <P>
  899.     Returns the current byte-offset of the cache object on
  900.     disk.  For read-objects, this is the offset after the last
  901.     successful disk read operation.  For write-objects, it is
  902.     the offset of the last successful disk write operation.
  903.  
  904. <sect4><em/STIOCB/ callback
  905.  
  906.     <P>
  907. <verb>
  908.     void
  909.     stiocb(void *data, int errorflag, storeIOState *sio)
  910. </verb>
  911.  
  912.     <P>
  913.     The <em/stiocb/ function is passed as a parameter to
  914.     <tt/storeOpen()/.  The filesystem layer calls <em/stiocb/
  915.     either when an I/O error occurs, or when the disk
  916.     object is closed.
  917.  
  918.     <P>
  919.     <em/errorflag/ is one of the following:
  920. <verb>
  921.     #define DISK_OK                   (0)
  922.     #define DISK_ERROR               (-1)
  923.     #define DISK_EOF                 (-2)
  924.     #define DISK_NO_SPACE_LEFT       (-6)
  925. </verb>
  926.  
  927.     <P>
  928.     Once the The <em/stiocb/ function has been called,
  929.     the <em/sio/ structure should not be accessed further.
  930.  
  931. <sect4><em/STRCB/ callback
  932.  
  933.     <P>
  934. <verb>
  935.     void
  936.     strcb(void *data, const char *buf, size_t len)
  937. </verb>
  938.  
  939.     <P>
  940.     The <em/strcb/ function is passed as a parameter to
  941.     <tt/storeRead()/.  The filesystem layer calls <em/strcb/
  942.     after a block of data has been read from the disk and placed
  943.     into <em/buf/.  <em/len/ indicates how many bytes were
  944.     placed into <em/buf/.  The <em/strcb/ function is only
  945.     called if the read operation is successful.  If it fails,
  946.     then the <em/STIOCB/ callback will be called instead.
  947.  
  948. <sect3>Config file parsing
  949.  
  950.     <P>
  951.     There are three functions relating to the Squid configuration
  952.     file: parsing, dumping, and freeing.
  953.  
  954.     <P>
  955.     The parse function is called at startup, and during a reconfigure,
  956.     for a <em/cache_dir/ line.  The first keyword after the <em/cache_dir/
  957.     keyword will be a filesystem type (such as "ufs").  A switch
  958.     statement in <tt/parse_cachedir/ will call the appropriate
  959.     filesystem-dependent parsing function.  The parsing function
  960.     may use <tt/strtok()/ to continue reading keywords after the
  961.     filesystem type on the <em/cache_dir/ line.
  962.  
  963.  
  964.     <P>
  965.     The ``dump'' function is used to output a configuration
  966.     file from the in-memory configuration structure.  It is
  967.     called with a <em/SwapDir/ argument, and must append one
  968.     line to the <em/StoreEntry/ that is holding the configuration
  969.     file being generated.
  970.  
  971.     <P>
  972.     The free function is called during a reconfigure (and at
  973.     exit) to free up (or un-initialize) any memory or structures
  974.     associated with the configuration line.  The <em/SwapDir/
  975.     structure includes common and private sections.  The
  976.     <tt/free_cachedir()/ function will handle freeing anything
  977.     in the common section, and relies on a filesystem-dependent
  978.     function to free, or un-initialize private members.
  979.  
  980. <sect3>Filesystem Startup, Initialization, and State Logging
  981.  
  982.     <P>
  983.     These functions deal with initializing, state
  984.     logging, and related tasks for a squid storage system.
  985.     These functions are used (called) in <tt/store_dir.c/.
  986.  
  987.     <P>
  988.     Each storage system must provide the functions described
  989.     in this section, although it may be a no-op (null) function
  990.     that does nothing.  Each function is accessed through a
  991.     function pointer stored in the <em/SwapDir/ structure:
  992.  
  993. <verb>
  994.     struct _SwapDir {
  995.         ...
  996.         STINIT *init;
  997.         STNEWFS *newfs;
  998.         struct {
  999.             STLOGOPEN *open;
  1000.             STLOGCLOSE *close;
  1001.             STLOGWRITE *write;
  1002.             struct {
  1003.                 STLOGCLEANOPEN *open;
  1004.                 STLOGCLEANWRITE *write;
  1005.                 void *state;
  1006.             } clean;
  1007.         } log;
  1008.         ....
  1009.     };
  1010. </verb>
  1011.  
  1012. <sect4><tt/init()/
  1013.  
  1014.     <P>
  1015. <verb>
  1016.         void
  1017.         STINIT(SwapDir *);
  1018. </verb>
  1019.  
  1020.     <P>
  1021.     The <tt/init/ function, of type <em/STINIT/ is called by
  1022.     <tt/storeDirInit()/ when Squid first starts up.  The
  1023.     <tt/init/ function should probably start the process of
  1024.     reading saved state information from disk (aka the "rebuild"
  1025.     procedure).
  1026.  
  1027. <sect4><tt/newfs()/
  1028.  
  1029.     <P>
  1030. <verb>
  1031.     void
  1032.     STNEWFS(SwapDir *);
  1033. </verb>
  1034.  
  1035.     <P>
  1036.     The <tt/newfs/ function, of type <em/STNEWFS/, is used to
  1037.     prepare a cache_dir for use by squid.  It is called when
  1038.     the user runs <em/squid -z/.  For the Unix file system,
  1039.     the <tt/newfs/ function makes all the two-layer subdirectories.
  1040.  
  1041. <sect4><tt/log.open()/
  1042.  
  1043.     <P>
  1044. <verb>
  1045.     void
  1046.     STLOGOPEN(SwapDir *);
  1047. </verb>
  1048.  
  1049.     <P>
  1050.     The <tt/log.open/ function, of type <em/STLOGOPEN/,
  1051.     is used to open or initialize the state-holding log
  1052.     files (if any) for the storage system.  For UFS this
  1053.     opens the <em/swap.state/ files.
  1054.  
  1055.     <P>
  1056.     The <tt/log.open/ function may be called any number of
  1057.     times during Squid's execution.  For example, the
  1058.     process of rotating, or writing clean logfiles closes
  1059.     the state log and then re-opens them.  A <em/squid -k reconfigure/
  1060.     does the same.
  1061.  
  1062. <sect4><tt/log.close()/
  1063.  
  1064.     <P>
  1065. <verb>
  1066.     void
  1067.     STLOGCLOSE(SwapDir *);
  1068. </verb>
  1069.  
  1070.     <P>
  1071.     The <tt/log.close/ function, of type <em/STLOGCLOSE/, is
  1072.     obviously the counterpart to <tt/log.open/.  It must close
  1073.     the open state-holding log files (if any) for the storage
  1074.     system.
  1075.  
  1076. <sect4><tt/log.write()/
  1077.  
  1078.     <P>
  1079. <verb>
  1080.     void
  1081.     STLOGWRITE(const SwapDir *, const StoreEntry *, int op);
  1082. </verb>
  1083.  
  1084.     <P>
  1085.     The <tt/log.write/ function, of type <em/STLOGWRITE/, is
  1086.     used to write an entry to the state-holding log file.  The
  1087.     <em/op/ argument is either <em/SWAP_LOG_ADD/ or <em/SWAP_LOG_DEL/.
  1088.     This feature may not be required by some storage systems
  1089.     and can be implemented as a null-function (no-op).
  1090.  
  1091. <sect4><tt/log.clean.open()/
  1092.  
  1093.     <P>
  1094. <verb>
  1095.     int
  1096.     STLOGCLEANOPEN(SwapDir *);
  1097. </verb>
  1098.  
  1099.     <P>
  1100.     The <tt/log.clean.open/ function, of type <em/STLOGCLEANOPEN/,
  1101.     is used for the process of writing "clean" state-holding
  1102.     log files.  The clean-writing procedure is initiated by
  1103.     the <em/squid -k rotate/ command.  This is a special case
  1104.     because we want to optimize the process as much as possible.
  1105.     This might be a no-op for some storage systems that don't
  1106.     have the same logging issues as UFS.
  1107.  
  1108.     <P>
  1109.     The <em/log.clean.state/ pointer may be used to
  1110.     keep state information for the clean-writing process, but
  1111.     should not be accessed by upper layers.
  1112.  
  1113. <sect4><tt/log.clean.write()/
  1114.  
  1115.     <P>
  1116. <verb>
  1117.     void
  1118.     STLOGCLEANWRITE(const StoreEntry *, SwapDir *);
  1119. </verb>
  1120.  
  1121.     <P>
  1122.     The <tt/log.clean.write/ function, of type <em/STLOGCLEANWRITE/,
  1123.     writes an entry to the clean log file (if any).
  1124.  
  1125.     <P>
  1126.     A NULL <em/StoreEntry/ argument indicates the end of
  1127.     the clean-writing process and signals the storage
  1128.     system to close the clean log, and rename or move them
  1129.     to become the official state-holding log.
  1130.  
  1131.  
  1132. <!-- %%%% Chapter : FORWARDING SELECTION %%%% -->
  1133. <sect>Forwarding Selection
  1134.  
  1135. <!-- %%%% Chapter : IP/FQDN CACHE %%%% -->
  1136. <sect>IP Cache and FQDN Cache
  1137.  
  1138. <sect1> Introduction
  1139.  
  1140.     <P>
  1141.     The IP cache is a built-in component of squid providing
  1142.     Hostname to IP-Number translation functionality and managing
  1143.     the involved data-structures. Efficiency concerns require
  1144.     mechanisms that allow non-blocking access to these mappings.
  1145.     The IP cache usually doesn't block on a request except for
  1146.     special cases where this is desired (see below).
  1147.  
  1148. <sect1> Data Structures 
  1149.  
  1150.     <P>
  1151.     The data structure used for storing name-address mappings
  1152.     is a small hashtable (<em>static hash_table *ip_table</em>),
  1153.     where structures of type <em>ipcache_entry</em> whose most
  1154.     interesting members are:
  1155.  
  1156. <verb>
  1157.     struct _ipcache_entry {
  1158.         char *name;
  1159.         time_t lastref;
  1160.         ipcache_addrs addrs;
  1161.         struct _ip_pending *pending_head;
  1162.         char *error_message;
  1163.         unsigned char locks;
  1164.         ipcache_status_t status:3;
  1165.     }
  1166. </verb>
  1167.  
  1168.  
  1169. <sect1> External overview
  1170.  
  1171.     <P>
  1172.     Main functionality
  1173.     is provided through calls to:
  1174.     <descrip>
  1175.  
  1176.     <tag>ipcache_nbgethostbyname(const char *name, IPH *handler,
  1177.     void *handlerdata)</tag>
  1178.     where <em/name/ is the name of the host to resolve,
  1179.     <em/handler/ is a pointer to the function to be called when
  1180.     the reply from the IP cache (or the DNS if the IP cache
  1181.     misses) and <em/handlerdata/ is information that is passed
  1182.     to the handler and does not affect the IP cache.
  1183.  
  1184.     <tag>ipcache_gethostbyname(const char *name,int flags)</tag>
  1185.     is different in that it only checks if an entry exists in
  1186.     it's data-structures and does not by default contact the
  1187.     DNS, unless this is requested, by setting the <em/flags/
  1188.     to <em/IP_BLOCKING_LOOKUP/ or <em/IP_LOOKUP_IF_MISS/.
  1189.  
  1190.     <tag>ipcache_init()</tag> is called from <em/mainInitialize()/
  1191.     after disk initialization and prior to the reverse fqdn
  1192.     cache initialization
  1193.  
  1194.     <tag>ipcache_restart()</tag> is called to clear the IP
  1195.     cache's data structures, cancel all pending requests.
  1196.     Currently, it is only called from <em/mainReconfigure/.
  1197.  
  1198.     </descrip>
  1199.  
  1200. <sect1> Internal Operation 
  1201.  
  1202.     <P>
  1203.     Internally, the execution flow is as follows: On a miss,
  1204.     <em/ipcache_getnbhostbyname/ checks whether a request for
  1205.     this name is already pending, and if positive, it creates
  1206.     a new entry using <em/ipcacheAddNew/ with the <em/IP_PENDING/
  1207.     flag set . Then it calls <em/ipcacheAddPending/ to add a
  1208.     request to the queue together with data and handler.  Else,
  1209.     <em/ipcache_dnsDispatch()/ is called to directly create a
  1210.     DNS query or to <em/ipcacheEnqueue()/ if all no DNS port
  1211.     is free.  <em/ipcache_call_pending()/ is called regularly
  1212.     to walk down the pending list and call handlers. LRU clean-up
  1213.     is performed through <em/ipcache_purgelru()/ according to
  1214.     the <em/ipcache_high/ threshold.
  1215.  
  1216. <!-- %%%% Chapter : SERVER PROTOCOLS %%%% -->
  1217. <sect>Server Protocols
  1218. <sect1>HTTP
  1219. <sect1>FTP
  1220. <sect1>Gopher
  1221. <sect1>Wais
  1222. <sect1>SSL
  1223. <sect1>Passthrough
  1224.  
  1225. <!-- %%%% Chapter : TIMEOUTS %%%% -->
  1226. <sect>Timeouts
  1227.  
  1228. <!-- %%%% Chapter : EVENTS %%%% -->
  1229. <sect>Events
  1230.  
  1231. <!-- %%%% Chapter : ACCESS CONTROLS %%%% -->
  1232. <sect>Access Controls
  1233.  
  1234. <!-- %%%% Chapter : ICP %%%% -->
  1235. <sect>ICP
  1236.  
  1237. <!-- %%%% Chapter : NETDB %%%% -->
  1238. <sect>Network Measurement Database
  1239.  
  1240. <!-- %%%% Chapter : Error Pages %%%% -->
  1241. <sect>Error Pages
  1242.  
  1243. <sect>Callback Data Database
  1244.  
  1245.     <P>
  1246.     Squid's extensive use of callback functions makes it very
  1247.     susceptible to memory access errors.  For a blocking operation
  1248.     with callback functions, the normal sequence of events is as
  1249.     follows:
  1250. <verb>
  1251.     callback_data = malloc(...);
  1252.     ...
  1253.     fooOperationStart(bar, callback_func, callback_data);
  1254.     ...
  1255.     fooOperationComplete(...);
  1256.     callback_func(callback_data, ....);
  1257.     ...
  1258.     free(callback_data);
  1259. </verb>
  1260.     However, things become more interesting if we want or need
  1261.     to free the callback_data, or otherwise cancel the callback,
  1262.     before the operation completes.
  1263.  
  1264.     <P>
  1265.     The callback data database lets us do this in a uniform and
  1266.     safe manner.  Every callback_data pointer must be added to the
  1267.     database.  It is then locked while the blocking operation executes
  1268.     elsewhere, and is freed when the operation completes.  The normal
  1269.     sequence of events is:
  1270. <verb>
  1271.     callback_data = malloc(...);
  1272.     cbdataAdd(callback_data);
  1273.     ...
  1274.     cbdataLock(callback_data);
  1275.     fooOperationStart(bar, callback_func, callback_data);
  1276.     ...
  1277.     fooOperationComplete(...);
  1278.     if (cbdataValid(callback_data)) {
  1279.         callback_func(callback_data, ....);
  1280.     cbdataUnlock(callback_data);
  1281.     cbdataFree(callback_data);
  1282. </verb>
  1283.  
  1284.     <P>
  1285.     With this scheme, nothing bad happens if <tt/cbdataFree/ gets called
  1286.     before <tt/cbdataUnlock/:
  1287. <verb>
  1288.     callback_data = malloc(...);
  1289.     cbdataAdd(callback_data);
  1290.     ...
  1291.     cbdataLock(callback_data);
  1292.     fooOperationStart(bar, callback_func, callback_data);
  1293.     ...
  1294.     cbdataFree(callback_data);
  1295.     ...
  1296.     fooOperationComplete(...);
  1297.     if (cbdataValid(callback_data)) {
  1298.         callback_func(callback_data, ....);
  1299.     cbdataUnlock(callback_data);
  1300. </verb>
  1301.     In this case, when <tt/cbdataFree/ is called before 
  1302.     <tt/cbdataUnlock/, the callback_data gets marked as invalid.  Before
  1303.     executing the callback function, <tt/cbdataValid/ will return 0
  1304.     and callback_func is never executed.  When <tt/cbdataUnlock/ gets
  1305.     called, it notices that the callback_data is invalid and will
  1306.     then call <tt/cbdataFree/.
  1307.  
  1308. <!-- %%%% Chapter : CACHE MANAGER %%%% -->
  1309. <sect>Cache Manager
  1310.  
  1311. <!-- %%%% Chapter : HTTP Headers %%%% -->
  1312. <sect>HTTP Headers
  1313.  
  1314.     <P>
  1315.     <em/Files:/
  1316.         <tt/HttpHeader.c/,
  1317.         <tt/HttpHeaderTools.c/,
  1318.         <tt/HttpHdrCc.c/,
  1319.         <tt/HttpHdrContRange.c/,
  1320.         <tt/HttpHdrExtField.c/,
  1321.         <tt/HttpHdrRange.c/
  1322.  
  1323.  
  1324.     <P> 
  1325.     <tt/HttpHeader/ class encapsulates methods and data for HTTP header
  1326.     manipulation.  <tt/HttpHeader/ can be viewed as a collection of HTTP
  1327.     header-fields with such common operations as add, delete, and find.
  1328.     Compared to an ascii "string" representation, <tt/HttpHeader/ performs
  1329.     those operations without rebuilding the underlying structures from
  1330.     scratch or searching through the entire "string".
  1331.  
  1332. <sect1>General remarks
  1333.  
  1334.     <P>
  1335.     <tt/HttpHeader/ is a collection (or array) of HTTP header-fields. A header
  1336.     field is represented by an <tt/HttpHeaderEntry/ object. <tt/HttpHeaderEntry/ is
  1337.     an (id, name, value) triplet.  Meaningful "Id"s are defined for
  1338.     "well-known" header-fields like "Connection" or "Content-Length".
  1339.     When Squid fails to recognize a field, it uses special "id",
  1340.     <em/HDR_OTHER/.  Ids are formed by capitalizing the corresponding HTTP
  1341.     header-field name and replacing dashes ('-') with underscores ('_').
  1342.  
  1343.     <P>
  1344.     Most operations on <tt/HttpHeader/ require a "known" id as a parameter. The
  1345.     rationale behind the later restriction is that Squid programmer should
  1346.     operate on "known" fields only. If a new field is being added to
  1347.     header processing, it must be given an id.
  1348.  
  1349. <sect1>Life cycle
  1350.  
  1351.     <P> 
  1352.     <tt/HttpHeader/ follows a common pattern for object initialization and
  1353.     cleaning:
  1354.  
  1355. <verb>
  1356.     /* declare */
  1357.     HttpHeader hdr;
  1358.     
  1359.     /* initialize (as an HTTP Request header) */
  1360.     httpHeaderInit(&hdr, hoRequest);
  1361.  
  1362.     /* do something */
  1363.     ...
  1364.  
  1365.     /* cleanup */
  1366.     httpHeaderClean(&hdr);
  1367. </verb>
  1368.  
  1369.     <P> 
  1370.     Prior to use, an <tt/HttpHeader/ must be initialized. A
  1371.     programmer must specify if a header belongs to a request
  1372.     or reply message. The "ownership" information is used mostly
  1373.     for statistical purposes.
  1374.  
  1375.     <P>
  1376.     Once initialized, the <tt/HttpHeader/ object <em/must/ be,
  1377.     eventually, cleaned.  Failure to do so will result in a
  1378.     memory leak.
  1379.  
  1380.     <P>
  1381.     Note that there are no methods for "creating" or "destroying"
  1382.     a "dynamic" <tt/HttpHeader/ object. Looks like headers are
  1383.     always stored as a part of another object or as a temporary
  1384.     variable. Thus, dynamic allocation of headers is not needed.
  1385.  
  1386.  
  1387. <sect1>Header Manipulation.
  1388.  
  1389.     <P>
  1390.     The mostly common operations on HTTP headers are testing
  1391.     for a particular header-field (<tt/httpHeaderHas()/),
  1392.     extracting field-values (<tt/httpHeaderGet*()/), and adding
  1393.     new fields (<tt/httpHeaderPut*()/).
  1394.  
  1395.     <P>
  1396.     <tt/httpHeaderHas(hdr, id)/ returns true if at least one
  1397.     header-field specified by "id" is present in the header.
  1398.     Note that using <em/HDR_OTHER/ as an id is prohibited.
  1399.     There is usually no reason to know if there are "other"
  1400.     header-fields in a header.
  1401.  
  1402.     <P>
  1403.     <tt/httpHeaderGet<Type>(hdr, id)/ returns the value
  1404.     of the specified header-field.  The "Type" must match
  1405.     header-field type. If a header is not present a "null"
  1406.     value is returned. "Null" values depend on field-type, of
  1407.     course.
  1408.  
  1409.     <P>
  1410.     Special care must be taken when several header-fields with
  1411.     the same id are preset in the header. If HTTP protocol
  1412.     allows only one copy of the specified field per header
  1413.     (e.g. "Content-Length"), <tt/httpHeaderGet<Type>()/
  1414.     will return one of the field-values (chosen semi-randomly).
  1415.     If HTTP protocol allows for several values (e.g. "Accept"),
  1416.     a "String List" will be returned.
  1417.  
  1418.     <P>
  1419.     It is prohibited to ask for a List of values when only one
  1420.     value is permitted, and visa-versa. This restriction prevents
  1421.     a programmer from processing one value of an header-field
  1422.     while ignoring other valid values.
  1423.  
  1424.     <P>
  1425.     <tt/httpHeaderPut<Type>(hdr, id, value)/ will add an
  1426.     header-field with a specified field-name (based on "id")
  1427.     and field_value. The location of the newly added field in
  1428.     the header array is undefined, but it is guaranteed to be
  1429.     after all fields with the same "id" if any. Note that old
  1430.     header-fields with the same id (if any) are not altered in
  1431.     any way.
  1432.  
  1433.     <P>
  1434.     The value being put using one of the <tt/httpHeaderPut()/
  1435.     methods is converted to and stored as a String object.
  1436.  
  1437.     <P>
  1438.     Example:
  1439.  
  1440. <verb>
  1441.         /* add our own Age field if none was added before */
  1442.         int age = ...
  1443.         if (!httpHeaderHas(hdr, HDR_AGE))
  1444.         httpHeaderPutInt(hdr, HDR_AGE, age);
  1445. </verb>
  1446.  
  1447.     <P>
  1448.     There are two ways to delete a field from a header. To
  1449.     delete a "known" field (a field with "id" other than
  1450.     <em/HDR_OTHER/), use <tt/httpHeaderDelById()/ function.
  1451.     Sometimes, it is convenient to delete all fields with a
  1452.     given name ("known" or not) using <tt/httpHeaderDelByName()/
  1453.     method. Both methods will delete <em/all/ fields specified.
  1454.  
  1455.     <P>
  1456.     The <em/httpHeaderGetEntry(hdr, pos)/ function can be used
  1457.     for iterating through all fields in a given header. Iteration
  1458.     is controlled by the <em/pos/ parameter. Thus, several
  1459.     concurrent iterations over one <em/hdr/ are possible. It
  1460.     is also safe to delete/add fields from/to <em/hdr/ while
  1461.     iteration is in progress.
  1462.  
  1463. <verb>
  1464.     /* delete all fields with a given name */
  1465.     HttpHeaderPos pos = HttpHeaderInitPos;
  1466.     HttpHeaderEntry *e;
  1467.     while ((e = httpHeaderGetEntry(hdr, &pos))) {
  1468.         if (!strCaseCmp(e->name, name))
  1469.             ... /* delete entry */
  1470.     }
  1471. </verb>
  1472.  
  1473.     Note that <em/httpHeaderGetEntry()/ is a low level function
  1474.     and must not be used if high level alternatives are available.
  1475.     For example, to delete an entry with a given name, use the
  1476.     <em/httpHeaderDelByName()/ function rather than the loop
  1477.     above.
  1478.  
  1479. <sect1>I/O and Headers.
  1480.  
  1481.     <P>
  1482.     To store a header in a file or socket, pack it using
  1483.     <tt/httpHeaderPackInto()/ method and a corresponding
  1484.     "Packer". Note that <tt/httpHeaderPackInto/ will pack only
  1485.     header-fields; request-lines and status-lines are not
  1486.     prepended, and CRLF is not appended. Remember that neither
  1487.     of them is a part of HTTP message header as defined by the
  1488.     HTTP protocol.
  1489.  
  1490.  
  1491. <sect1>Adding new header-field ids.
  1492.  
  1493.     <P> 
  1494.     Adding new ids is simple. First add new HDR_ entry to the
  1495.     http_hdr_type enumeration in enums.h. Then describe a new
  1496.     header-field attributes in the HeadersAttrs array located
  1497.     in <tt/HttpHeader.c/. The last attribute specifies field
  1498.     type. Five types are supported: integer (<em/ftInt/), string
  1499.     (<em/ftStr/), date in RFC 1123 format (<em/ftDate_1123/),
  1500.     cache control field (<em/ftPCc/), range field (<em/ftPRange/),
  1501.     and content range field (<em/ftPContRange/).  Squid uses
  1502.     type information to convert internal binary representation
  1503.     of fields to their string representation (<tt/httpHeaderPut/
  1504.     functions) and visa-versa (<tt/httpHeaderGet/ functions).
  1505.  
  1506.     <P>
  1507.     Finally, add new id to one of the following arrays:
  1508.     <em/GeneralHeadersArr/, <em/EntityHeadersArr/,
  1509.     <em/ReplyHeadersArr/, <em/RequestHeadersArr/.  Use HTTP
  1510.     specs to determine the applicable array.  If your header-field
  1511.     is an "extension-header", its place is in <em/ReplyHeadersArr/
  1512.     and/or in <em/RequestHeadersArr/. You can also use
  1513.     <em/EntityHeadersArr/ for "extension-header"s that can be
  1514.     used both in replies and requests.  Header fields other
  1515.     than "extension-header"s must go to one and only one of
  1516.     the arrays mentioned above.
  1517.  
  1518.     <P>
  1519.     Also, if the new field is a "list" header, add it to the
  1520.     <em/ListHeadersArr/ array.  A "list" field-header is the
  1521.     one that is defined (or can be defined) using "#" BNF
  1522.     construct described in the HTTP specs. Essentially, a field
  1523.     that may have more than one valid field-value in a single
  1524.     header is a "list" field.
  1525.  
  1526.     <P>
  1527.     In most cases, if you forget to include a new field id in
  1528.     one of the required arrays, you will get a run-time assertion.
  1529.     For rarely used fields, however, it may take a long time
  1530.     for an assertion to be triggered.
  1531.  
  1532.     <P>
  1533.     There is virtually no limit on the number of fields supported
  1534.     by Squid. If current mask sizes cannot fit all the ids (you
  1535.     will get an assertion if that happens), simply enlarge
  1536.     HttpHeaderMask type in <tt/typedefs.h/.
  1537.  
  1538.  
  1539. <sect1>A Word on Efficiency.
  1540.  
  1541.     <P>
  1542.     <tt/httpHeaderHas()/ is a very cheap (fast) operation
  1543.     implemented using a bit mask lookup.
  1544.  
  1545.     <P>
  1546.     Adding new fields is somewhat expensive if they require
  1547.     complex conversions to a string.
  1548.  
  1549.     <P>
  1550.     Deleting existing fields requires scan of all the entries
  1551.     and comparing their "id"s (faster) or "names" (slower) with
  1552.     the one specified for deletion.
  1553.  
  1554.     <P>
  1555.     Most of the operations are faster than their "ascii string"
  1556.     equivalents.
  1557.  
  1558. <sect>File Formats
  1559.  
  1560. <sect1><em/swap.state/
  1561.  
  1562. <P>
  1563. NOTE: this information is current as of version 2.2.STABLE4.
  1564.  
  1565. <P>
  1566. A <em/swap.state/ entry is defined by the <em/storeSwapLogData/
  1567. structure, and has the following elements:
  1568. <verb>
  1569. struct _storeSwapLogData {
  1570.     char op;
  1571.     int swap_file_number;
  1572.     time_t timestamp;
  1573.     time_t lastref;
  1574.     time_t expires;
  1575.     time_t lastmod;
  1576.     size_t swap_file_sz;
  1577.     u_short refcount;
  1578.     u_short flags;
  1579.     unsigned char key[MD5_DIGEST_CHARS];
  1580. };
  1581. </verb>
  1582.  
  1583. <descrip>
  1584. <tag/op/
  1585.     Either SWAP_LOG_ADD (1) when an object is added to
  1586.     the disk storage, or SWAP_LOG_DEL (2) when an object is
  1587.     deleted.
  1588.  
  1589. <tag/swap_file_number/
  1590.     The 32-bit file number which maps to a pathname.  Only
  1591.     the low 24-bits are relevant.  The high 8-bits are
  1592.     used as an index to an array of storage directories, and
  1593.     are set at run time because the order of storage directories
  1594.     may change over time.
  1595.  
  1596. <tag/timestamp/
  1597.     A 32-bit Unix time value that represents the time when
  1598.     the origin server generated this response.  If the response
  1599.     has a valid <em/Date:/ header, this timestamp corresponds
  1600.     to that time.  Otherwise, it is set to the Squid process time
  1601.     when the response is read (as soon as the end of headers are
  1602.     found).
  1603.  
  1604. <tag/lastref/
  1605.     The last time that a client requested this object.
  1606.     Strictly speaking, this time is set whenver the StoreEntry
  1607.     is locked (via <em/storeLockObject()/). 
  1608.  
  1609. <tag/expires/
  1610.     The value of the response's <em/Expires:/ header, if any.
  1611.     If the response does not have an <em/Expires:/ header, this
  1612.     is set to -1.  If the response has an invalid (unparseable)
  1613.     <em/Expires:/ header, it is also set to -1.  There are some cases
  1614.     where Squid sets <em/expires/ to -2.  This happens for the
  1615.     internal ``netdb'' object and for FTP URL responses.
  1616.  
  1617. <tag/lastmod/
  1618.     The value of the response's <em/Last-modified:/ header, if any.
  1619.     This is set to -1 if there is no <em/Last-modified:/ header,
  1620.     or if it is unparseable.
  1621.  
  1622. <tag/swap_file_sz/
  1623.     This is the number of bytes that the object occupies on
  1624.     disk.  It includes the Squid ``swap file header''.
  1625.  
  1626. <tag/refcount/
  1627.     The number of times that this object has been accessed (referenced).
  1628.     Since its a 16-bit quantity, it is susceptible to overflow
  1629.     if a single object is accessed 65,536 times before being replaced.
  1630.  
  1631. <tag/flags/
  1632.     A copy of the <em/StoreEntry/ flags field.  Used as a sanity
  1633.     check when rebuilding the cache at startup.  Objects that
  1634.     have the KEY_PRIVATE flag set are not added back to the cache.
  1635.  
  1636. <tag/key/
  1637.     The 128-bit MD5 hash for this object.
  1638.     
  1639. </descrip>
  1640.  
  1641. Note that <em/storeSwapLogData/ entries are written in native machine
  1642. byte order.  They are not necessarily portable across architectures.
  1643.  
  1644. <sect>Store ``swap meta'' Description
  1645. <p>
  1646. ``swap meta'' refers to a section of meta data stored at the beginning
  1647. of an object that is stored on disk.  This meta data includes information
  1648. such as the object's cache key (MD5), URL, and part of the StoreEntry
  1649. structure.
  1650.  
  1651. <p>
  1652. The meta data is stored using a TYPE-LENGTH-VALUE format.  That is,
  1653. each chunk of meta information consists of a TYPE identifier, a
  1654. LENGTH field, and then the VALUE (which is LENGTH octets long).
  1655.  
  1656. <sect1>Types
  1657.  
  1658. <p>
  1659. As of Squid-2.3, the following TYPES are defined (from <em/enums.h/):
  1660. <descrip>
  1661. <tag/STORE_META_VOID/
  1662.     Just a placeholder for the zeroth value.   It is never used
  1663.     on disk.
  1664.  
  1665. <tag/STORE_META_KEY_URL/
  1666.     This represents the case when we use the URL as the cache
  1667.     key, as Squid-1.1 does.  Currently we don't support using
  1668.     a URL as a cache key, so this is not used.
  1669.  
  1670. <tag/STORE_META_KEY_SHA/
  1671.     For a brief time we considered supporting SHA (secure
  1672.     hash algorithm) as a cache key.  Nobody liked it, and
  1673.     this type is not currently used.
  1674.  
  1675. <tag/STORE_META_KEY_MD5/
  1676.     This represents the MD5 cache key that Squid currently uses.
  1677.     When Squid opens a disk file for reading, it can check that
  1678.     this MD5 matches the MD5 of the user's request.  If not, then
  1679.     something went wrong and this is probably the wrong object.
  1680.  
  1681. <tag/STORE_META_URL/
  1682.     The object's URL.  This also may be matched against a user's
  1683.     request for cache hits to make sure we got the right object.
  1684.  
  1685. <tag/STORE_META_STD/
  1686.     This is the ``standard metadata'' for an object.  Really
  1687.     its just this middle chunk of the StoreEntry structure:
  1688. <verb>
  1689.     time_t timestamp;
  1690.     time_t lastref;
  1691.     time_t expires;
  1692.     time_t lastmod;
  1693.     size_t swap_file_sz;
  1694.     u_short refcount;
  1695.     u_short flags;
  1696. </verb>
  1697.  
  1698. <tag/STORE_META_HITMETERING/
  1699.     Reserved for future hit-metering (RFC 2227) stuff.
  1700.  
  1701. <tag/STORE_META_VALID/
  1702.     ?
  1703.  
  1704. <tag/STORE_META_END/
  1705.     Marks the last valid META type.
  1706.  
  1707. </descrip>
  1708.  
  1709.  
  1710. <sect1>Implementation Notes
  1711.  
  1712. <p>
  1713. When writing an object to disk, we must first write the meta data.
  1714. This is done with a couple of functions.  First, <tt/storeSwapMetaPack()/
  1715. takes a <em/StoreEntry/ as a parameter and returns a <em/tlv/ linked
  1716. list.  Second, <tt/storeSwapMetaPack()/ converts the <em/tlv/ list
  1717. into a character buffer that we can write.
  1718.  
  1719. <p>
  1720. Note that the <em/MemObject/ has a member called <em/swap_hdr_sz/.
  1721. This value is the size of that character buffer; the size of the
  1722. swap file meta data.  The <em/StoreEntry/ has a member named
  1723. <em/swap_file_sz/ that represents the size of the disk file.
  1724. Thus, the size of the object ``content'' is
  1725. <verb>
  1726.     StoreEntry->swap_file_sz  - MemObject->swap_hdr_sz;
  1727. </verb>
  1728. Note that the swap file content includes the HTTP reply headers
  1729. and the HTTP reply body (if any).
  1730.  
  1731. <p>
  1732. When reading a swap file, there is a similar process to extract
  1733. the swap meta data.  First, <tt/storeSwapMetaUnpack()/ converts a
  1734. character buffer into a <em/tlv/ linked list.  It also tells us
  1735. the value for <em/MemObject->swap_hdr_sz/.
  1736.  
  1737. </article>
  1738.